// Storage 工具类
// TODO: 实现 localStorage 封装
// 封装 localStorage 操作，支持序列化、过期时间等功能


interface StorageData<T>{
    value: T
  expire?: number // 过期时间戳
}

class Storage {
    private prefix: string // 前缀

    constructor(prefix = 'dmxk_'){
        this.prefix = prefix
    }

    // 获取完整的key
    private getKey(key: string): string {
        return `${this.prefix}${key}`
    }

    /**
     * 设置存储
     * @param key 键名
     * @param value 值
     * @param expire 过期时间（秒）
     * 
    */
    set<T = any>(key: string, value: T, expire?: number): void {
        if (!process.client) return

        try {
            const data: StorageData<T> = {
                value,
                expire: expire ? Date.now() + expire * 1000 : undefined,
            }
            localStorage.setItem(this.getKey(key), JSON.stringify(data))
        } catch (error) {
            console.error('Storage set error:', error)
        }
    }

    /**
     * 获取存储
     * @param key 键名
     * @param defaultValue 默认值
     */
    get<T = any>(key: string, defaultValue?: T): T | null {
        if (!process.client) return defaultValue || null

        try {
            const item = localStorage.getItem(this.getKey(key))
            if (!item) return defaultValue || null
            
            const data: StorageData<T> = JSON.parse(item)

            // 检查是否过期
            if (data.expire && Date.now() > data.expire) {
                this.remove(key)
                return defaultValue || null
            }

            return data.value
        } catch (error) {
            console.error('Storage get error:', error)
            return defaultValue || null
        }
    }

    /**
     * 删除存储
     * @param key 键名
     */
    remove(key: string): void {
        if (!process.client) return
        
        try {
            localStorage.removeItem(this.getKey(key))
        } catch (error) {
            console.error('Storage remove error:', error)
        }
    }

    /**
     * 清空所有存储（仅清除带前缀的）
     */
    clear(): void {
        if (!process.client) return
        
        try {
            const keys = Object.keys(localStorage)
            keys.forEach(key => {
                if (key.startsWith(this.prefix)) {
                    localStorage.removeItem(key)
                }
            })
        } catch (error) {
            console.error('Storage clear error:', error)
        }
    }

    /**
     * 检查是否存在
     * @param key 键名
     */
    has(key: string): boolean {
        return this.get(key) !== null
    }
}

// 导出单例
export const storage = new Storage()

// 导出便捷方法
export const setStorage = storage.set.bind(storage)
export const getStorage = storage.get.bind(storage)
export const removeStorage = storage.remove.bind(storage)
export const clearStorage = storage.clear.bind(storage)
export const hasStorage = storage.has.bind(storage)